#pragma once

#include "Protocol.hpp"
#include "Calculator.hpp"
#include "Parser.hpp"
#include "Logger.hpp"
#include <iostream>
#include <string>
#include <functional>

using handler_t = std::function<Response(Request &)>;
//  只负责报文解析
class Parser
{
public:
    Parser(handler_t handler) : _handler(handler)
    {
    }
    std::string Parse(std::string &inbuffer)
    {
        std::string package_ptr;
        while (true) // 循环处理多个请求
        {
            // 1. 解包
            std::string jsonstr;
            int n = Protocol::UnPackage(inbuffer, &jsonstr);
            if (n == 0)
            {
                // return std::string();
                break;
            }
            else if (n < 0)
            {
                exit(1);
            }
            // 解包成功
            LOG(LogLevel::DEBUG) << jsonstr;
            // 2. 反序列化
            Request rq;
            rq.Deserialize(jsonstr);

            // 3. 业务处理
            Response rp = _handler(rq);

            // 4. 序列化
            std::string send_str;
            rp.Serializ(&send_str);

            // 5. 打包
            package_ptr += Protocol::Package(send_str);
        }
        // 6. 返回
        return package_ptr;
    }
    ~Parser()
    {
    }

private:
    handler_t _handler;
};